#!/usr/bin/env python3
'''tempature measure using I2C'''  # 使用I2C协议的温度测量
'''software tools : smbus'''      # 使用smbus库操作I2C总线
'''hardware       : KS103    '''  # KS103传感器使用温度测量

import smbus # 加载smbus库来连接i2c端口
import time
import sys

# 初始化I2C总线（树莓派I2C-1对应GPIO2/3物理引脚）
bus = smbus.SMBus(1) #open /dev/i2c-1 
address = 0x74 #i2c device address（设备地址为0x74）
# 温度测量命令列表（不同精度对应输入寄存器的值）
wr_cmd = [0xc9, 0xca, 0xcb, 0xcc]  #tempature measurement cmd 
# 对应的实际精度（单位：℃）
precision = [0.5, 0.25, 0.125, 0.0625] # tempature measurement precision 
#rd_cmd = 0xb2  # 超声波测距模式命令（当前未开启使用）
##range 0-5m, return flight time(us), remember divided by 2
try:# #便于捕获Ctrl-C中断，从而退出
    # 用户交互输入所需的精度
    print('Please input number 0~3 to select tempature measurement precision. ')
    print('0 : 0.5℃,')    # 精度最低
    print('1 : 0.25℃,')   # 一般精度
    print('2 : 0.125℃,')  # 较高精度
    print('3 : 0.0625℃,') # 最高精度
    
    # 获取用户输入并验证是否有效
    cmd_num = eval(input('Input number:'))
    if(cmd_num not in [0,1,2,3]):  # 输入值必须在0-3范围内
        print('Input error!')
        sys.exit()  # 错误的输入，退出
    
    # 显示用户选择的精度参数
    print('precision selected:',precision[cmd_num])
    cmd = wr_cmd[cmd_num]  # 获取对应输入寄存器的值
    
    # 主测量循环
    while True:
        # 发送温度测量命令（寄存器0x2写入输入寄存器的值，来控制测量精度）
        bus.write_byte_data(address, 0x2, cmd)
        
        # 等待测量完成（测量需要61ms，选择延时1秒）
        time.sleep(1) #MIN ~ 0.061（单位：秒）
        
        # 读取原始数据（两个8位寄存器组成16位有效数据）
        HighByte = bus.read_byte_data(address, 0x2) # 高8位（包含符号位）
        LowByte = bus.read_byte_data(address, 0x3)  # 低8位
        
        # 数据合成处理（高8位+低8位获得16位结果）
        data = (HighByte << 8) + LowByte  # 合并高低位字节
        
        # 负温度处理（二进制补码转换）
        if(HighByte >= 0xF8):  # 判断符号位（当高5位全为1时是负数）
            data = data - 65536 #2**16（将16位数去除负号）
        
        # 温度计算（固定转换系数0.0625℃）
        Temp = data * 0.0625  # 原始数据右移4位（data/16）
        
        # 输出带符号的温度值
        print('Tempature:', Temp, '℃')
        #time.sleep(2)
except KeyboardInterrupt:  # 捕获Ctrl+C信号
    pass

# 清理I2C资源
bus.close()
print('The end!')  # 程序终止
